package cn.lzg.common.core.codec;

import java.util.List;

import cn.lzg.common.core.model.Response;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

public class ResponseDecoder extends ByteToMessageDecoder {

	// 数据包基础长度
	public static int BASE_LENTH = 4 + 2 + 2 + 4;

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
		while (true) {
			if (buffer.readableBytes() >= BASE_LENTH) {
				// 记录数据包开始位置
				int beginIndex;
				// 循环寻找包头
				while (true) {
					beginIndex = buffer.readerIndex();
					buffer.markReaderIndex();
					if (buffer.readInt() == Constants.HEADER_FLAG) {
						break;
					}
					buffer.resetReaderIndex();
					buffer.readByte();

					// 可读数据小于基础长度，等待数据到达
					if (buffer.readableBytes() < BASE_LENTH) {
						return;
					}
				}

				// 模块号
				short module = buffer.readShort();
				// 命令号
				short cmd = buffer.readShort();

				// 数据长度
				int len_data = buffer.readInt();
				if (len_data < 0) {
					ctx.channel().close();
					return;
				}

				// buffer中可读数据小于数据长度，数据未完全到达，将读索引重置到包头位置
				if (buffer.readableBytes() < len_data) {
					buffer.readerIndex(beginIndex);
					return;
				}

				byte[] data = new byte[len_data];
				buffer.readBytes(data);

				// 封装响应对象
				Response response = new Response();
				response.setModule(module);
				response.setCmd(cmd);
				response.setData(data);
				out.add(response);
			} else {// 数据包长度小于基础长度
				break;
			}
		} // while

		// 数据包不完整
		return;
	}

}
